package com.jiazhong.内部类.匿名内部类;
//基于接口的  和   基于类的

//1.本质是类  2.内部类  3.该类没有名字
// 4.同时还是一个对象---推理--->**自我看法**：理解为对象更合适，类名由系统分配，且类只能使用一次，后面不再使用

//基本语法：
//new 类或接口（参数列表）{
// 类体
// };
public class Demo01 {
    public static void main(String[] args) {
        Outer04 outer04=new Outer04();
        outer04.method();
    }
}
class Outer04{
    private int n1=10;
    public void method(){
        class XXX implements IA{
            @Override
            public void cry() {
                System.out.println("老虎叫唤");
            }
        }
        //基于接口的
        IA tiger=new IA() {//基于接口的
            @Override
            public void cry() {
                System.out.println("老虎叫唤");
            }
        };
        IA cat=new IA() {//基于接口的
            @Override
            public void cry() {
                System.out.println("喵喵喵");
            }
        };
        System.out.println("tiger的运行类型="+tiger.getClass());//class com.jiazhong.内部类.匿名内部类.Outer04$1
        tiger.cry();
        System.out.println("cat的运行类型="+cat.getClass());//class com.jiazhong.内部类.匿名内部类.Outer04$2
        cat.cry();

        //基于类的
        //注意：ktm参数列表会传递给构造器
        Father father=new Father("ktm"){
            @Override
            public void test() {
                System.out.println("匿名内部类重写了test方法");
            }
        };
        System.out.println("Father对象的运行类型是="+father.getClass());
        father.test();

        Animal animal=new Animal() {
            @Override
            void eat() {
                System.out.println("小狗吃骨头");
            }
        };
        animal.eat();
    }
}
interface IA{
    public void cry();
}
class Father{//类
    public Father(String name) {//构造器
        System.out.println("接收到的name="+name);
    }
    public void test(){//方法
    }
}
abstract class Animal{//抽象类
    abstract void eat();
}
